package com.woniuxy.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.nimbusds.jose.JOSEException;
import com.woniuxy.entity.Address;
import com.woniuxy.entity.Book;
import com.woniuxy.entity.User;
import com.woniuxy.entity.UserCart;
import com.woniuxy.entity.dto.UserDTO;
import com.woniuxy.mapper.UserMapper;
import com.woniuxy.service.UserService;
import com.woniuxy.util.JWTUtil;
import com.woniuxy.util.ResponseData;
import com.woniuxy.util.ResponseEnum;
import com.woniuxy.util.UserContext;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author ：CuiYC
 * @description：
 * @date ：Created in 2025/3/10 16:46
 * @modified By：
 */
@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {

    /**
     * @param user
     * @return
     * 1：根据账号查询用户信息
     * 2：判断用户信息是否存在
     *      不存在：账号错误——账号不存在
     * 3：判断密码是否正确
     *      错误：密码错误——密码错误
     *
     * 4：给该用户创建jwt
     * 5：把jwt存入Redis
     * 6：把用户信息和jwt一起返回（欢迎XXX登录）
     */
    private UserMapper userMapper;

    //操作Redis类:写数据，获取数据，删除数据
    private StringRedisTemplate redisTemplate;

    @Override
    public ResponseData<?> login(User user) throws JOSEException {
        //1：根据账号查询用户信息
        User userInfo = userMapper.queryUserInfo(user);
        //2：判断用户信息是否存在
        if (userInfo == null) {
            //账号错误
            return ResponseData.fail(ResponseEnum.LOGIN_ERROR);
        }
        //处于对密码安全性考虑，都要给密码加盐值。加盐之后再加密放入数据库。
//        String salt = "1a2b3c4daghlaurhasdjfanghagaggaga";
//        String s = String.valueOf(salt.charAt(1) + salt.charAt(2));

        String md5PWD = SecureUtil.md5(user.getPassword() + "1a2b3c4d");
        //3：判断密码是否正确
        if (!md5PWD.equals(userInfo.getPassword())) {
            //密码错误
            return ResponseData.fail(ResponseEnum.LOGIN_ERROR);
        }
        //4：给该用户创建jwt
        HashMap<String, Object> userMap = new HashMap<>();
        //不能放敏感信息！！！
        userMap.put("id", userInfo.getId());
        userMap.put("account", userInfo.getAccount());
        String jwt = JWTUtil.createJWT(userMap);//也可以直接用胡同工具包的createJWT方法

        //5：把jwt存入Redis（redis就是一个采用key， value方式存储的数据库）
        // key命名规范：多个单词用“:”连接，单词字母全大写
            //参数三：数值
            //参数四：单位
//        redisTemplate.opsForValue().set("JWT:" + userInfo.getId(), jwt);
        redisTemplate.opsForValue().set("JWT:" + userInfo.getId(), jwt, 15*60*60*24, TimeUnit.SECONDS);

        //6：把用户信息和jwt一起返回（欢迎XXX登录）
        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("userInfo", new UserDTO(userInfo));
        resultMap.put("jwt", jwt);
        return  ResponseData.ok(resultMap);
    }

    /**
     * 用户添加购物车
     * @param id
     * @param buyNum
     * @return
     */
    private HttpServletRequest request;
    private RedisTemplate<String, Object> redisTemplateInit;
    @Override
    public ResponseData<?> addCart(Integer id, Integer buyNum) throws ParseException {
        /**
         * 1：判断用户是否添加过此书籍
         *      没有：新增
         *      有：修改
         * 2：判断购物车信息是否存在
         * 3：判断购物车中是否存在该商品
         */
        UserCart userCartParam = new UserCart();
        Integer userId = UserContext.getUserId();

        userCartParam.setUserId(userId);
        userCartParam.setBookId(id);
        //1：判断用户是否添加过此书籍
        UserCart userCartInfo = userMapper.queryUserCart(userCartParam);

        //从redis中获取书籍信息
        Book cacheBook = (Book) redisTemplateInit.opsForHash().get("CACHE:BOOKSERVICEIMPL:QUERYBOOKBYID", id + "");
        //购买量= 用户购买数量 + 购物车中已有的数量
        userCartParam.setBuyNum(userCartInfo == null ? buyNum : userCartInfo.getBuyNum() + buyNum);
        //写入最新价格从redis中获取
        userCartParam.setBuyPrice( cacheBook.getPrice());
        //总价= 购买数量 * 最新价格
        userCartParam.setTotalPrice(userCartParam.getBuyPrice().multiply(new BigDecimal(userCartParam.getBuyNum())));

        if (userCartInfo == null) {
            //该用户没有添加过此书籍，新增记录
            userMapper.addUserCart(userCartParam);
        }else {
            //修改记录
            userCartParam.setId(userCartInfo.getId());
            userMapper.updateUserCart(userCartParam);
        }
        return ResponseData.ok();
    }

    /**
     * 查询用户购物车和收货地址
     * @return
     */
    @Override
    public ResponseData<?> queryUserCartAndAddr() throws ParseException {
        Integer userId = UserContext.getUserId();
        //查询用户收货地址
        List<Address> addresses = userMapper.queryUserAddress(userId);
        //查询用户购物车
        List<UserCart> userCarts = userMapper.queryUserCarts(userId);

        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("addresses", addresses);
        resultMap.put("userCarts", userCarts);

        return ResponseData.ok(resultMap);
    }
}
